/**
 * @file pointsgenerator.h generowanie punktów
 */

#ifndef POINTSGENERATOR_H
#define POINTSGENERATOR_H

#include <QObject>
#include <QTimer>

/**
 * @class PointsGenerator
 * @brief generowanie punktów
 * klasa zajmująca się generowaniem punktów i informowaniem o postępie
 */
class PointsGenerator: public QObject
{
	Q_OBJECT
public:
	/**
	 * @brief instancja klasy
	 * funkcja zwracająca instancję klasy tak by tylko 1 była na cały program
	 * @return instancja
	 */
	static PointsGenerator * instance();
	/**
	 * @brief zwraca punkty
	 * funkcja zwraca wygenerowane punkty
	 * @return punkty
	 */
	double**& getPointMap();
	/**
	 * zwrócenie rozmiaru generowanego
	 * @brief rozmiar generowany
	 * @return rozmiar
	 */
	const int getSize();
	/**
	 * destruktor
	 */
	virtual ~PointsGenerator();
	/**
	 * skok o frame klatek
	 * @brief skok o zadaną liczbę klatek
	 * @param frame liczba klatek
	 */
	void selectFrame(int frame=1);
	/**
	 * sprawdzenie czy animacja jest uruchomiona
	 * @brief czy animacja jest uruchomiona?
	 * @return stan animacji
	 */
	bool isStarted();
signals:
	/**
	 * sygnał wysyłający wygenerowane punkty zaraz po zakończeniu generowania
	 * @param data tablica punktów z wartościami
	 * @param max maksymalna odległość wartości od 0
	 * @brief sygnał wysyłający wygenerowane punkty
	 */
	void onPointMap(double ** data, double max);
public slots:
	/**
	 * @brief uruchomienie zegarów (animacji)
	 * start animacji
	 * @see PointsGenerator::sStop
	 */
	void sStart();
	/**
	 * @brief zatrzymanie zegarów
	 * stop animacji
	 * @see PointsGenerator::sStart
	 */
	void sStop();
	/**
	 * @brief slot wymuszający wygenerowanie 1 klatki
	 * generowanie pojedynczej klatki
	 */
	void sPrepare();
	/**
	 * @brief wyświetlenie aktualnej różnicy klatek
	 * różnica klatek w odpowiednich momentach
	 */
	void sfps();
private:
	PointsGenerator();
	int size;
	double** pointMap;
	QTimer time;
	QTimer fps;
	int capts;
	int lcaps;
};

#endif // POINTSGENERATOR_H
